<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    xmlns:a="attribute"
    xmlns:o="object"
    xmlns:c="collection"
>

  <xsl:output method="text" indent="yes" encoding="utf-8" version="1.0"/>


  <xsl:template match="/" >
    <xsl:for-each select="//c:Entities">
      <xsl:call-template name="Entitie"></xsl:call-template>
    </xsl:for-each>
  </xsl:template>
  <xsl:template name="Entitie">
    <xsl:for-each select="o:Entity">
      <xsl:if test="count(a:Comment)>0">
/**
 * <xsl:value-of select="a:Comment"></xsl:value-of>
 */
</xsl:if>class M_<xsl:value-of select="a:Name"/> extends ModuleBase{
  <xsl:call-template name="insert"></xsl:call-template>

  <xsl:call-template name="update"></xsl:call-template>

  <xsl:call-template name="delete"></xsl:call-template>

  <xsl:call-template name="single"></xsl:call-template>

  <xsl:call-template name="list"></xsl:call-template>
}
















    </xsl:for-each>
  </xsl:template>

  <xsl:template name="insert">
    /**
    *
    * @param <xsl:value-of select="a:Name"/> $<xsl:value-of select="a:Name"/>
    * @return <xsl:value-of select="a:Name"/>
    */
    public function insert($<xsl:value-of select="a:Name"/>=null){
      if($<xsl:value-of select="a:Name"/>===null){
        return null;
      }

      $o=new <xsl:value-of select="a:Name"/>($<xsl:value-of select="a:Name"/>);
      /**
      *
      * @todo Ini
      */
    <xsl:for-each select="c:Attributes/o:EntityAttribute">
      <xsl:if test="a:DataType='Identity'">
      $o-&gt;<xsl:value-of select="a:Name"/>=$this->db->guid();
      </xsl:if>
    </xsl:for-each>
      if($this-&gt;db-&gt;insert('<xsl:value-of select="a:Name"/>',$o-&gt;__modetoarray())&gt;0){
        $this-&gt;_dishsave('<xsl:value-of select="a:Name"/>',<xsl:call-template name="guidlink"><xsl:with-param name="sender" select="'o'"></xsl:with-param></xsl:call-template>, $o);
      }
      else{
    <xsl:for-each select="c:Attributes/o:EntityAttribute">
      <xsl:if test="a:DataType='Identity'">
        $o-&gt;<xsl:value-of select="a:Name"></xsl:value-of>=null;
      </xsl:if>
    </xsl:for-each>
      }
      return $o;
    }
  </xsl:template>

  <xsl:template name="update">
    /**
    *
    * @param <xsl:value-of select="a:Name"/> $<xsl:value-of select="a:Name"/>
    * @return int
    */
    public function update($<xsl:value-of select="a:Name"/>=null){
      if($<xsl:value-of select="a:Name"/>===null){
          return 0;
      }

      $o=new <xsl:value-of select="a:Name"/>($<xsl:value-of select="a:Name"/>);/**
      *
      * @todo Condition
      */

      if($this-&gt;db-&gt;update('<xsl:value-of select="a:Name"/>',$o->__modetoarray(array(<xsl:call-template name="arraydata"><xsl:with-param name="sender" select="'o'"></xsl:with-param></xsl:call-template>)),array(<xsl:call-template name="primarykey"><xsl:with-param name="sender" select="'o'"></xsl:with-param></xsl:call-template>))&gt;0){
        $this-&gt;_dishsave('<xsl:value-of select="a:Name"/>', <xsl:call-template name="guidlink"><xsl:with-param name="sender" select="'o'"></xsl:with-param></xsl:call-template>, $o);
        return 1;
      }else{
        return 0;
      }
    }
  </xsl:template>

  <xsl:template name="delete">
    /**
     * @param <xsl:value-of select="a:Name"/> $<xsl:value-of select="a:Name"/>
     * return int
     */
    public function delete($<xsl:value-of select="a:Name"/>=null){
      if($<xsl:value-of select="a:Name"/>===null<xsl:call-template name="validateprimarykey"></xsl:call-template>){
        return 0;
      }
      if($this->db->delete('<xsl:value-of select="a:Name"/>',array(<xsl:call-template name="primarykey"><xsl:with-param name="sender" select="a:Name"></xsl:with-param></xsl:call-template>))>0){
        $this->_dishclear($<xsl:value-of select="a:Name"/>, <xsl:call-template name="guidlink"><xsl:with-param name="sender" select="a:Name"></xsl:with-param></xsl:call-template>);
        return 1;
      }else{
        return 0;
      }
    }
  </xsl:template>

  <xsl:template name="list">
    /**
    *
    * @param object {'PageIndex':0,'PageSize':20}
    */
    public function arraylist($search=null){
      $li=array();
      $cond=array();      
      
      $PageIndex=0;$PageSize=20;
      if($search!==null){
        if(is_numeric($search->PageIndex)){
          $PageIndex=$search->PageIndex;
        }
        if(is_numeric($search->PageSize)){
          $PageSize=$search->PageSize;
        }
      }      
      
      foreach($this->db->select('<xsl:value-of select="a:Name"/>',$cond,'',array(intval($PageIndex),intval($PageSize))) as $i){
        $li=new <xsl:value-of select="a:Name"/>();
      }
      return $li;
    }
  </xsl:template>

  <xsl:template name="single">
    /**
     * @param <xsl:value-of select="a:Name"/> $<xsl:value-of select="a:Name"/>
     */
    public function single($<xsl:value-of select="a:Name"/>=null){
      if($<xsl:value-of select="a:Name"/>===null<xsl:call-template name="validateprimarykey"></xsl:call-template>){
        return null;
      }
      $o=$this->_dishread('<xsl:value-of select="a:Name"/>',<xsl:call-template name="guidlink"><xsl:with-param name="sender" select="a:Name"></xsl:with-param></xsl:call-template>);
      
      if($o===null){
        foreach($this->db->select('<xsl:value-of select="a:Name"/>',array(<xsl:call-template name="primarykey"><xsl:with-param name="sender" select="a:Name"></xsl:with-param></xsl:call-template>)) as $i){
          $o=new <xsl:value-of select="a:Name"/>($i);break;
        }
        if($o!==null){
          $this->_dishsave('<xsl:value-of select="a:Name"/>',<xsl:call-template name="guidlink"><xsl:with-param name="sender" select="'o'"></xsl:with-param></xsl:call-template>,$o);
        }
      }
      return $o;
    }
  </xsl:template>
  
  <!--Object Primary Key Link To Make A GUID-->
  <xsl:template name="guidlink">
    <xsl:param name="sender" select="this" />
    <xsl:param name="index" select="1"/>
    <xsl:param name="first" select="1" />
    <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]">
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType='Identity'">
        <xsl:if test="$first=0">.</xsl:if>$<xsl:value-of select="$sender"></xsl:value-of>-&gt;<xsl:value-of select="c:Attributes/o:EntityAttribute[position()=$index]/a:Name" />
        <xsl:call-template name="guidlink">
          <xsl:with-param name="sender" select="$sender"></xsl:with-param>
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="0"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType!='Identity'">
        <xsl:call-template name="guidlink">
          <xsl:with-param name="sender" select="$sender"></xsl:with-param>
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="$first"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
    </xsl:if>
  </xsl:template>

  <!--Object Primary Key Array-->
  <xsl:template name="primarykey">
    <xsl:param name="sender" select="this" />
    <xsl:param name="index" select="1"/>
    <xsl:param name="first" select="1" />
    <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]">
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType='Identity'">
        <xsl:if test="$first=0">,</xsl:if>'<xsl:value-of select="c:Attributes/o:EntityAttribute[position()=$index]/a:Name" />'=>$<xsl:value-of select="$sender"></xsl:value-of>-><xsl:value-of select="c:Attributes/o:EntityAttribute[position()=$index]/a:Name" />
        <xsl:call-template name="guidlink">
          <xsl:with-param name="sender" select="$sender"></xsl:with-param>
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="0"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType!='Identity'">
        <xsl:call-template name="guidlink">
          <xsl:with-param name="sender" select="$sender"></xsl:with-param>
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="$first"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
    </xsl:if>
  </xsl:template>

  <!--Object Private Data Not Containt The Primary Key-->
  <xsl:template name="arraydata">
    <xsl:param name="sender" select="this" />
    <xsl:param name="index" select="1"/>
    <xsl:param name="first" select="1" />
    <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]">
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType!='Identity'">
        <xsl:if test="$first=0">,</xsl:if>'<xsl:value-of select="c:Attributes/o:EntityAttribute[position()=$index]/a:Name" />'=>$<xsl:value-of select="$sender"></xsl:value-of>-><xsl:value-of select="c:Attributes/o:EntityAttribute[position()=$index]/a:Name" />
        <xsl:call-template name="arraydata">
          <xsl:with-param name="sender" select="$sender"></xsl:with-param>
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="0"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType='Identity'">
        <xsl:call-template name="arraydata">
          <xsl:with-param name="sender" select="$sender"></xsl:with-param>
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="$first"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
    </xsl:if>
  </xsl:template>

  <!--Object Primary Key For Update and Delete  -->
  <xsl:template name="validateprimarykey">
    <xsl:param name="index" select="1"/>
    <xsl:param name="first" select="1" />
    <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]">
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType='Identity'">||<xsl:if test="$first=0"></xsl:if>!isset($<xsl:value-of select="a:Name"/>-&gt;<xsl:value-of select="c:Attributes/o:EntityAttribute[position()=$index]/a:Name" />)||empty($<xsl:value-of select="a:Name"/>-&gt;<xsl:value-of select="c:Attributes/o:EntityAttribute[position()=$index]/a:Name" />)<xsl:call-template name="validateprimarykey">
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="0"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
      <xsl:if test="c:Attributes/o:EntityAttribute[position()=$index]/a:DataType!='Identity'">
        <xsl:call-template name="validateprimarykey">
          <xsl:with-param name="index" select="$index+1"></xsl:with-param>
          <xsl:with-param name="first" select="$first"></xsl:with-param>
        </xsl:call-template>
      </xsl:if>
    </xsl:if>
  </xsl:template>
  
</xsl:stylesheet>